import { utils } from "@/utils";
import { Enum } from "@/share/enums/enum";

/**
 * 扩展Context对象的常用响应方法，以便于处理成功、失败、错误、无权限等情况。
 * 这些方法直接在Context对象上定义，使得在中间件或路由处理函数中可以直接调用，简化了响应处理的代码。
 *
 * @param {Context} c - 当前的上下文对象，通常包含请求和响应信息。
 * @param {Next} next - 中间件的下一个函数，必须调用以继续处理链。
 */
export async function expand(c: Context, next: Next) {
  c.success = success;
  c.fail = fail;
  c.error = error;
  c.noAuth = noAuth;
  c.noPer = noPer;
  await next();
}

/**
 * 标准的成功响应处理函数。
 * 设置响应状态码为成功，并返回包含成功代码和可选数据的响应体。
 *
 * @param {Context} this - 当前的上下文对象。
 * @param {any} [data] - 可选的成功数据，将包含在响应体中。
 */
function success(this: Context, data?: any) {
  this.status = Enum.Code.Success;
  this.body = { code: Enum.Code.Success, msg: "操作成功", data: data };
}

/**
 * 处理请求失败的情况。
 * 设置响应状态码为失败，并返回包含失败消息的响应体。
 *
 * @param {Context} this - 当前的上下文对象。
 * @param {string} msg - 失败的详细消息。
 */
function fail(this: Context, message: string) {
  this.status = Enum.Code.Success;
  this.body = { code: Enum.Code.Fail, msg: message, data: null };
}

/**
 * 处理服务端错误的情况。
 * 根据环境设置不同的错误消息，以避免在生产环境中泄露敏感信息。
 * 设置响应状态码为错误，并返回包含错误代码和消息的响应体。
 *
 * @param {Context} this - 当前的上下文对象。
 * @param {string} [message] - 可选的错误详细消息，默认为"服务异常"。
 */
function error(this: Context, messgae?: string) {
  let msg = messgae || "服务异常";
  if (!utils.isDev) msg = "服务异常";
  this.status = Enum.Code.Success;
  this.body = { code: Enum.Code.Error, msg, data: null };
}

/**
 * 处理未登录的情况。
 * 设置响应状态码为未授权，并返回包含未登录消息的响应体。
 *
 * @param {Context} this - 当前的上下文对象。
 */
function noAuth(this: Context) {
  this.status = Enum.Code.Success;
  this.body = { code: Enum.Code.NoAuth, msg: "未登录", data: null };
}

/**
 * 处理没有权限的情况。
 * 设置响应状态码为无权限，并返回包含无权限消息的响应体。
 *
 * @param {Context} this - 当前的上下文对象。
 */
function noPer(this: Context) {
  this.status = Enum.Code.Success;
  this.body = { code: Enum.Code.NoPer, msg: "没有权限", data: null };
}
